package com.example.springbootdemo.utils.excle;

import com.alibaba.excel.EasyExcel;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.List;
import java.util.Objects;

/**
 * @author xuwangqi
 * @date 2021/5/31 15:02
 **/
public class EasyExcelUtil {
    /**
     * 读取第一个 sheet 的 Excel
     *
     * @param stream    文件
     * @param tClass 实体类映射，
     * @return Excel 数据 list
     */
//    public  static <T> List<T> readExcel(InputStream stream, Class<T> tClass) {
//        return readExcel(stream,tClass,1);
//    }

    /**
     * 读取某个 sheet 的 Excel
     *
     * @param stream    文件
     * @param tClass  实体类映射
     * @param sheetNo sheet 的序号 从1开始 /sheetNO 为空则读取第一个sheetNO
     * @return Excel 数据 list
     */
//    public  static <T>  List<T> readExcel(InputStream stream, Class<T> tClass,Integer sheetNo) {
//        if (Objects.isNull(sheetNo)||sheetNo==0){
//            sheetNo=1;
//        }
//        EasyExcelListener<T> listener=new EasyExcelListener<T>();
//        //easyExcel sheetNo从零开始
//        EasyExcel.read(stream, tClass, listener).sheet(sheetNo-1).doRead();
//        return listener.getDatas();
//    }
    /**
     * 导出 Excel ：一个 sheet，带表头 本地生成文件导出Excle
     *
     * @param fileName  文件名 ***。xlsx
     * @param list      导出数据 list，
     * @param clazz   导出结构体
     * @param sheetName 导入文件的 sheet 名
     */
    public static <T> void writeExcel(String fileName, List<T> list, Class clazz, String sheetName) {
        EasyExcel.write(fileName,clazz).sheet(sheetName).doWrite(list);
    }


    /**
     * 导出 Excel ：一个 sheet，带表头  OutputStream 读 用于页面响应数据导出
     *
     * @param outputStream  OutputStream
     * @param list      导出数据 list，
     * @param clazz   导出结构体
     * @param sheetName 导入文件的 sheet 名
     */
    public static <T> void writeExcel(OutputStream outputStream, List<T> list, Class clazz,Boolean autoCloseStream,String sheetName) {
        EasyExcel.write(outputStream,clazz).autoCloseStream(autoCloseStream).sheet(sheetName).doWrite(list);
    }

    /**
     * 导出 Excel 直接可以在Spring web Controller 中使用
     *
     * @param response  HttpServletResponse
     * @param fileName  文件名
     * @param list      导出的数据 list，
     * @param clazz   导出结构体 类
     *@param  autoCloseStream  是否自动关闭流，就是冲刷缓存区 true or false
     * @param sheetName 导入文件的 sheet 名
     */
    public static <T> void writeExcel(HttpServletResponse response, String fileName, List<T> list, Class<T> clazz,Boolean autoCloseStream, String sheetName) throws  IOException {
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止文件名中文乱码 当然和easyexcel没有关系
        String fileNameEnCode = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "+");
        //文件是附件下载 还是直接浏览器打开 attachment附件下载 online 浏览器打开(未经考证)
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileNameEnCode + ".xlsx");
        writeExcel(response.getOutputStream(),list,clazz,autoCloseStream,sheetName);
    }
}
